//
// Created by Administrator on 25-5-14.
//

#ifndef USK_LOGGER_IMPL_PRIVATE_H
#define USK_LOGGER_IMPL_PRIVATE_H

#include "Poco/AutoPtr.h"
#include "Poco/File.h"
#include "Poco/Logger.h"
#include "Poco/LoggingRegistry.h"
#include "Poco/Path.h"
#include "Poco/Util/LoggingConfigurator.h"
#include "Poco/Util/PropertyFileConfiguration.h"

namespace usk {
    namespace core {
        class USKLoggerImplPrivate {
        public:
            USKLoggerImplPrivate(std::string name) { logger_ = &Poco::Logger::get(name); }

            ~USKLoggerImplPrivate() {
            }

            /// @brief 默认的日志格式
            static Poco::AutoPtr<Poco::Util::PropertyFileConfiguration>
            GetDefaultLoggerConfiguration() {
                Poco::AutoPtr<Poco::Util::PropertyFileConfiguration> default_config(
                    new Poco::Util::PropertyFileConfiguration());
                // 设置日志输出格式  2025-01-01.100 [Debug] [name]:debug info
                default_config->setString("logging.formatters.f1.class",
                                          "PatternFormatter");
                default_config->setString("logging.formatters.f1.pattern",
                                          "%Y-%m-%d %H:%M:%S.%i [%p][%J][%s]:%t");

                // 控制台日志输出
                default_config->setString("logging.channels.console.class",
                                          "ConsoleChannel");
                default_config->setString("logging.channels.console.formatter", "f1");

                // 文件日志输出

                default_config->setString("logging.channels.file.class", "FileChannel");
                default_config->setString("logging.channels.file.formatter", "f1");
                default_config->setString("logging.channels.file.path", GetDefaultLogPath());
                default_config->setString("logging.channels.file.rotation", "daily");
                default_config->setString("logging.channels.file.archive", "timestamp");

                // 输出通道
                default_config->setString("logging.channels.splitter.class",
                                          "SplitterChannel");
                default_config->setString("logging.channels.splitter.channels",
                                          "console,file");

                // 异步通道
                // default_config->setString("logging.channels.async.class",
                //                           "AsyncChannel");
                // default_config->setString("logging.channels.async.channel",
                //                           "splitter");

                default_config->setString("logging.loggers.root.channel", "splitter");
                default_config->setString("logging.loggers.root.level", "debug");

                return default_config;
            }

            static void SetLogConfiguration(
                Poco::AutoPtr<Poco::Util::PropertyFileConfiguration> property_config) {
                // 先清空原来的配置
                Poco::LoggingRegistry::defaultRegistry().clear();
                Poco::Util::LoggingConfigurator log_configurator;
                log_configurator.configure(property_config);
            }

            static std::string GetDefaultLogPath() {
                // 默认输出路径是,当前程序目录下的logs目录
                std::string self_path = Poco::Path::self();
                Poco::Path self(self_path);
                auto base_name = self.getBaseName();
                auto log_path = self.parent().pushDirectory("logs");
                Poco::File directory(log_path);
                try {
                    // 3. 创建目录（若父目录不存在会自动创建）
                    directory.createDirectories(); // 关键方法
                } catch (const Poco::Exception &e) {
                    log_path = self.parent();
                }
                log_path.setBaseName(base_name).setExtension("log");
                return log_path.toString();
            }

            Poco::AutoPtr<Poco::Logger> logger_;
        };
    } // namespace core
} // namespace usk

#endif // USK_LOGGER_IMPL_PRIVATE_H
